//一个缓冲区不够？ 那就来两个
#include "buffer.h"
#include <sys/uio.h>

using namespace tiny_muduo;

int Buffer::ReadFd(int fd){
    char extrabuf[65536]={0};
    struct iovec iv[2];
    /*
        这个iovec是linux系统中调用readv和writev时使用的结构体，它的定义如下
        struct iovec {
            void *iov_base;  //要读取或写入的指针
            size_t iov_len;  //要读取的长度
    */
   const int writable=writeablebytes();
   iv[0].iov_base=beginwrite();
   iv[0].iov_len=writable; //iv[0]从写下标开始，大小是可写长度
   iv[1].iov_base=extrabuf;
   iv[1].iov_len=sizeof(extrabuf); //iv[1]表示额外的缓冲区，当iv[0]大小不够用时会使用iv[1]

   const int iovcnt=(writable<static_cast<int>(sizeof(extrabuf))?2:1); //够用就不用iv[1]，不够用就俩都用
   int readn=readv(fd,iv,iovcnt);//readv() 是一种 vectored I/O操作，它可以从指定的文件描述符 fd 读取数据，并将数据分布到一个或多个缓冲区中,第三个参数就是缓冲区数量
    //readv返回值是读取的fd文件的大小
   if(readn<0){
    assert(readn>=0);
   }else if(readn<=writable){
    write_index_+=readn;
   }else{
        write_index_=buffer_.size();
        Append(extrabuf,readn-writable);
   }
   return readn;
}